﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Systemet.Technical
{
    /// <summary>
    /// Klassen används för att hantera personal. Uppdatera, hämta, spara, skapa personal.
    /// </summary>
    class PersonalConnection
    {
        private LinqToSQLDataContext database;
        private bool successfull = false;
        private string connection;

        //Hämtar alla Anställda
        public List<Personalregister> RetrieveStaff()
        {
            try
            {
                connection = AccessController.Instance.Connection;
                database = new LinqToSQLDataContext(connection);

                //var staff = from Personalregister in database.Personalregisters
                //            join Roll in database.Rolls on Personal.rollID equals (int?)Roll.rollID
                //            select new { Personal.Fnamn, Personal.Enamn, Personal.personnummer, Personal.andratDatum, Personal.Månadslön, Personal.Sysselsättningsgrad, Personal.Vakansavdrag, Personal.signatur, Roll.rollID };
                //Personal employee = new Personal();


                //List<Personal> StaffList = staff.AsEnumerable()
                //                .Select(s => new Personal
                //                {
                //                    Förnamn = s.Fnamn,
                //                    Efternamn = s.Enamn,
                //                    Personnummer = s.personnummer,
                //                    Roll = s.rollID,
                //                    Datum = (DateTime)s.andratDatum,
                //                    Månadslön = s.Månadslön,
                //                    Sysselsättningsgrad = s.Sysselsättningsgrad,
                //                    Vakansavdrag = s.Vakansavdrag,
                //                    Signatur = s.signatur
                //                }).ToList();

                IEnumerable<Personalregister> staff = from Personalregister in database.Personalregisters
                                                      select Personalregister;

                database.Connection.Close();
                //return StaffList;
                return staff.ToList();
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }
        }

        //Vet ej om denna bör ändras, plockar från flera tabeller!
        //Filtrerar anställda efter sökkriterier för att fylla datagridview
        public object FilterStaffForDgv(string avd, string pNamn, string PersNr)
        {
            try
            {
                connection = AccessController.Instance.Connection;
                database = new LinqToSQLDataContext(connection);

                var staff = from Personal in database.Personalregisters
                            join PersonalAvdelning in database.Personalavdelnings on Personal.personnummer equals PersonalAvdelning.personnummer
                            where PersonalAvdelning.avdelningsnamn.Contains(avd) && ((Personal.Fnamn.Contains(pNamn)) || (Personal.Enamn.Contains(pNamn)) || (Personal.Fnamn + " " + Personal.Enamn).Contains(pNamn))
                            && Personal.personnummer.StartsWith(PersNr)

                            select new { Personal.personnummer, Personal.Fnamn, Personal.Enamn, Personal.Månadslön, Personal.Sysselsättningsgrad, Personal.Vakansavdrag, PersonalAvdelning.avdelningsnamn, PersonalAvdelning.procentsats };

                database.Connection.Close();
                return staff.ToList();
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }
        }


        //Hämtar personalAllokeringar baserat på Persnr eller alla om det är för sökkriterier
        public List<Personalavdelning> retrievStaffdepartment(string PersNr)
        {
            try
            {
                connection = AccessController.Instance.Connection;
                database = new LinqToSQLDataContext(connection);
                if (PersNr != "")
                {
                    IEnumerable<Personalavdelning> Allokeringar = from PersonalAvdelning in database.Personalavdelnings
                                                                  where PersonalAvdelning.personnummer == PersNr
                                                                  select PersonalAvdelning;

                    //List<Personalavdelning> PersAllokeringar = new List<Personalavdelning>();

                    //foreach (Personalavdelning pA in Allokeringar)
                    //{
                    //    Personalavdelning newPers = new Personalavdelning();
                    //    newPers.avdelningsnamn = pA.avdelningsnamn;
                    //    newPers.procentsats = pA.procentsats;
                    //    newPers.personnummer = pA.personnummer;
                    //    PersAllokeringar.Add(newPers);
                    //}

                    database.Connection.Close();
                    return Allokeringar.ToList();
                }
                else
                {
                    connection = AccessController.Instance.Connection;
                    database = new LinqToSQLDataContext(connection);

                    IEnumerable<Personalavdelning> department = from Personalavdelning in database.Personalavdelnings
                                                                select Personalavdelning;

                    //List<Personalavdelning> departmentList = department.AsEnumerable()
                    //    .Select(d => new Personalavdelning
                    //    {
                    //        personnummer = d.personnummer,
                    //        avdelningsnamn = d.avdelningsnamn,
                    //        procentsats = d.procentsats
                    //    }).ToList();

                    database.Connection.Close();
                    return department.ToList();
                }
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return null;
            }
        }

        public bool validatePersonal(Personalregister personalObject, bool isNew)
        {
            try
            {
                connection = AccessController.Instance.Connection;
                database = new LinqToSQLDataContext(connection);

                var nyPersonal = from Personalregister in database.Personalregisters
                                 where Personalregister.personnummer == personalObject.personnummer
                                 select Personalregister.personnummer;

                if (!nyPersonal.Contains(personalObject.personnummer) && isNew == true)
                {
                    //Trolla bort, utföras i GUI
                    MessageBox.Show("Ny anställd registrerad.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    successfull = Personalregistrering(personalObject);
                }
                else if (nyPersonal.Contains(personalObject.personnummer) && isNew == false)
                {
                    //Trolla bort, utföras i GUI
                    MessageBox.Show("Anställd är ändrad.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    successfull = UpdatePersonalregister(personalObject);
                }
                return successfull;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return false;
            }
        }

        //Registrerar ett nytt personalobjekt
        private bool Personalregistrering(Personalregister personalObject)
        {
            try
            {
                connection = AccessController.Instance.Connection;
                database = new LinqToSQLDataContext(connection);
                //Personalregister nyPersonal = new Personalregister
                //{
                //    personnummer = personalObject.personnummer,
                //    Fnamn = personalObject.Fnamn,
                //    Enamn = personalObject.Enamn,
                //    andratDatum = personalObject.andratDatum,
                //    Månadslön = personalObject.Månadslön,
                //    signatur = personalObject.signatur,
                //    Sysselsättningsgrad = personalObject.Sysselsättningsgrad,
                //    Vakansavdrag = personalObject.Vakansavdrag,
                //    rollID = personalObject.Roll

                //};

                Personalregister nyPersonal = personalObject;

                database.Personalregisters.InsertOnSubmit(nyPersonal);
                database.SubmitChanges();

                database.Connection.Close();
                return true;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return false;
            }
        }
        //Lägg till nya allokeringar
        public bool RegisterAllocations(List<Personalavdelning> allocations, bool IsnewEmployee)
        {
            try
            {
                connection = AccessController.Instance.Connection;
                database = new LinqToSQLDataContext(connection);


                foreach (Personalavdelning pA in allocations)
                {
                    Personalavdelning newAllocation = new Personalavdelning
                    {
                        personnummer = pA.personnummer,
                        avdelningsnamn = pA.avdelningsnamn,
                        procentsats = pA.procentsats

                    };

                    database.Personalavdelnings.InsertOnSubmit(newAllocation);
                    database.SubmitChanges();
                }
                database.Connection.Close();
                return true;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return false;
            }
        }
        //Borttagning av tidigare allokeringar
        public bool RemoveStaffAllocations(string persNr)
        {
            try
            {
                connection = AccessController.Instance.Connection;
                database = new LinqToSQLDataContext(connection);

                var allocations = from Personalavdelning in database.Personalavdelnings
                                  where Personalavdelning.personnummer == persNr
                                  select Personalavdelning;

                foreach (var aC in allocations)
                {
                    database.Personalavdelnings.DeleteOnSubmit(aC);
                }
                database.SubmitChanges();
                database.Connection.Close();
                return true;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return false;
            }
        }

        //Uppdaterar ett personalobjekt i databasen med motsvarande personnummer
        private bool UpdatePersonalregister(Personalregister personalObject)
        {
            Personalregister uppdateraPersonal = database.Personalregisters.Single(p => p.personnummer == personalObject.personnummer);
            try
            {
                uppdateraPersonal.Fnamn = personalObject.Fnamn;
                uppdateraPersonal.Enamn = personalObject.Enamn;
                uppdateraPersonal.Månadslön = personalObject.Månadslön;
                uppdateraPersonal.Sysselsättningsgrad = personalObject.Sysselsättningsgrad;
                uppdateraPersonal.Vakansavdrag = personalObject.Vakansavdrag;
                uppdateraPersonal.andratDatum = personalObject.andratDatum;
                uppdateraPersonal.signatur = personalObject.signatur;

                database.SubmitChanges();
                return true;
            }
            catch (Exception e)
            {
                database.Connection.Close();
                return false;
            }
        }
    }
}
